package com.lam.framework.security.service;

import org.springframework.stereotype.Service;

import com.lam.common.constant.CommonConstant;
import com.lam.common.context.TokenUtils;
import com.lam.common.utils.CollectionUtil;
import com.lam.common.utils.StringUtils;

/**
 * 自定义权限实现，ss取自SpringSecurity首字母
 * 
 * @author lam
 */
@Service("ss")
public class PermissionService {

	/**
	 * 验证用户是否不具备某权限，与 hasPermi逻辑相反
	 * @param perm 权限标识
	 * @return 
	 */
	public boolean lacksPermi(String perm) {
		if (StringUtils.isBlank(perm)) {
			return false;
		}
		return !hasPm(perm);
	}
	
	/**
	 * 验证用户是否有某权限
	 * 
	 * @param perm 单个权限标识
	 * @return 
	 */
	public boolean hasPm(String perm) {
		
//		return true;
		return hasAnyPm(perm);
	}
	
	/**
	 * 验证用户是否有指定的全部权限
	 * 
	 * @param perms 权限标识，多个用英文逗号分隔
	 * @return 
	 */
	public boolean hasPms(String perms) {
		
		if (StringUtils.isBlank(perms)) {
			return false;
		}
		
		String[] ss = perms.split(",");
		return CollectionUtil.contains(ss, CommonConstant.ALL_PERMISSION) || TokenUtils.hasPermissions(true, ss);
	}

	/**
	 * 验证用户是否具有以下任意一个权限
	 * @param perms 权限标识，多个用英文逗号分隔
	 * @return 
	 */
	public boolean hasAnyPm(String perms) {
		
		if (StringUtils.isBlank(perms)) {
			return false;
		}
		
		String[] ss = perms.split(",");
		return TokenUtils.hasPermissions(false, ss) || CollectionUtil.contains(ss, CommonConstant.ALL_PERMISSION);
	}

	/**
	 * 验证用户是否不具备某角色，与 isRole逻辑相反。
	 * @param role 角色名称
	 * @return 
	 */
	public boolean lacksRole(String role) {
		
		if (StringUtils.isBlank(role)) {
			return false;
		}
		return !hasRole(role);
	}
	
	/**
	 * 判断用户是否拥有某个角色
	 * @param role 角色标识
	 * @return 
	 */
	public boolean hasRole(String role) {
		
		return hasAnyRole(role);
	}
	
	/**
	 * 判断用户是否拥有某个角色
	 * @param role 角色标识，多个以英文逗号分隔
	 * @return 
	 */
	public boolean hasRoles(String roles) {
		
		if (StringUtils.isBlank(roles)) {
			return false;
		}
		
		String[] ss = roles.split(",");
		return CollectionUtil.contains(ss, CommonConstant.ADMIN_ROLE_KEY) || TokenUtils.hasRoles(true, ss);
	}

	/**
	 * 验证用户是否具有以下任意一个角色
	 * @param roles 角色标识，多个以英文逗号分隔
	 * @return 
	 */
	public boolean hasAnyRole(String roles) {
		
		if (StringUtils.isBlank(roles)) {
			return false;
		}
		
		String[] ss = roles.split(",");
		return CollectionUtil.contains(ss, CommonConstant.ADMIN_ROLE_KEY) || TokenUtils.hasRoles(false, ss);
	}

}
